require 'rubygems'
require 'rake'
require 'rdoc'
require 'date'
require 'yaml'

$LOAD_PATH.unshift(File.join(File.dirname(__FILE__), *%w[lib]))
require 'jekyll/version'

Dir.glob('rake/**.rake').each { |f| import f }

#############################################################################
#
# Helper functions
#
#############################################################################

def name
  "jekyll"
end

def version
  Jekyll::VERSION
end

def docs_name
  "#{name}-docs"
end

def gemspec_file
  "#{name}.gemspec"
end

def gem_file
  "#{name}-#{Gem::Version.new(version).to_s}.gem"
end

def normalize_bullets(markdown)
  markdown.gsub(/\n\s{2}\*{1}/, "\n-")
end

def linkify_prs(markdown)
  markdown.gsub(/#(\d+)/) do |word|
    "[#{word}]({{ site.repository }}/issues/#{word.delete("#")})"
  end
end

def linkify_users(markdown)
  markdown.gsub(/(@\w+)/) do |username|
    "[#{username}](https://github.com/#{username.delete("@")})"
  end
end

def linkify(markdown)
  linkify_users(linkify_prs(markdown))
end

def liquid_escape(markdown)
  markdown.gsub(/(`{[{%].+[}%]}`)/, "{% raw %}\\1{% endraw %}")
end

def custom_release_header_anchors(markdown)
  header_regexp = /^(\d{1,2})\.(\d{1,2})\.(\d{1,2}) \/ \d{4}-\d{2}-\d{2}/
  section_regexp = /^### \w+ \w+$/
  markdown.split(/^##\s/).map do |release_notes|
    _, major, minor, patch = *release_notes.match(header_regexp)
    release_notes
      .gsub(header_regexp, "\\0\n{: #v\\1-\\2-\\3}")
      .gsub(section_regexp) { |section| "#{section}\n{: ##{sluffigy(section)}-v#{major}-#{minor}-#{patch}}" }
  end.join("\n## ")
end

def sluffigy(header)
  header.gsub(/#/, '').strip.downcase.gsub(/\s+/, '-')
end

def remove_head_from_history(markdown)
  index = markdown =~ /^##\s+\d+\.\d+\.\d+/
  markdown[index..-1]
end

def converted_history(markdown)
  remove_head_from_history(
    custom_release_header_anchors(
      liquid_escape(
        linkify(
          normalize_bullets(markdown)))))
end

def siteify_file(file, overrides_front_matter = {})
  abort "You seem to have misplaced your #{file} file. I can haz?" unless File.exists?(file)
  title = begin
            File.read(file).match(/\A# (.*)$/)[1]
          rescue
            File.basename(file, ".*").downcase.capitalize
          end
  slug  = File.basename(file, ".markdown").downcase
  front_matter = {
    "title"     => title,
    "layout"    => "docs",
    "permalink" => "/docs/#{slug}/",
    "note"      => "This file is autogenerated. Edit /#{file} instead."
  }.merge(overrides_front_matter)
  contents = "#{front_matter.to_yaml}---\n\n#{content_for(file)}"
  File.write("site/_docs/#{slug}.md", contents)
end

def content_for(file)
  contents = File.read(file)
  case file
  when "History.markdown"
    converted_history(contents)
  else
    contents.gsub(/\A# .*\n\n?/, "")
  end
end

#############################################################################
#
# Standard tasks
#
#############################################################################

multitask :default => [:test, :features]

task :spec => :test
require 'rake/testtask'
Rake::TestTask.new(:test) do |test|
  test.libs << 'lib' << 'test'
  test.pattern = 'test/**/test_*.rb'
  test.verbose = true
end

require 'rdoc/task'
Rake::RDocTask.new do |rdoc|
  rdoc.rdoc_dir = 'rdoc'
  rdoc.title = "#{name} #{version}"
  rdoc.rdoc_files.include('README*')
  rdoc.rdoc_files.include('lib/**/*.rb')
end

begin
  require 'cucumber/rake/task'
  Cucumber::Rake::Task.new(:features) do |t|
    t.profile = "travis"
  end
  Cucumber::Rake::Task.new(:"features:html", "Run Cucumber features and produce HTML output") do |t|
    t.profile = "html_report"
  end
rescue LoadError
  desc 'Cucumber rake task not available'
  task :features do
    abort 'Cucumber rake task is not available. Be sure to install cucumber as a gem or plugin'
  end
end

desc "Open an irb session preloaded with this library"
task :console do
  sh "irb -rubygems -r ./lib/#{name}.rb"
end
